#include <my_header.h>
#if 0
现在有两个线程t1和t2，t1 打印 A 和 C，t2 打印 B。
书写代码，使用条件变量每次的显示顺序都是A->B->C。

代码书写完成后，回答问题：条件变量中加锁的目的是什么？
保持各个线程之间进行互斥操作，以免某个线程过早占用CPU
资源而导致其他线程紧急的任务无法执行，加条件变量更好的
在锁中切换。
#endif
/* Usage: ./8_条件变量 */
pthread_mutex_t lock;
pthread_cond_t cond;
int flag = 0;   //某个线程检测flag==0,以此判断是否先上线
void *funAC(void* arg)
{
    pthread_mutex_lock(&lock);
    if(flag == 0)
    {
        // A先上线
        flag =1;
        printf("A \n");
        pthread_cond_wait(&cond, &lock);
        printf("C \n");
        pthread_mutex_unlock(&lock);
        // 先执行AC
    }else{
        // B先运行
        printf("A \n");
        pthread_cond_signal(&cond);
        pthread_cond_wait(&cond, &lock);
        printf("C \n");
        pthread_mutex_unlock(&lock);
    }
    return NULL;
}
void *funB(void *arg)
{
    pthread_mutex_lock(&lock);
    if(flag == 0)
    {
        // B先上线获取锁
        flag = 1;
        pthread_cond_wait(&cond, &lock);
        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&lock);
    }
    else{
        // A先上线，C后上线
        printf("B \n");
        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&lock);
    }
    return NULL;
}
int main(void){                                  

    // 创建子线程
    pthread_t tid1, tid2;
    int ret_create1 = pthread_create(&tid1, NULL, funAC, NULL);
    THREAD_ERROR_CHECK(ret_create1, "pthread_create1");
     int ret_create2 = pthread_create(&tid2, NULL, funB, NULL);
    THREAD_ERROR_CHECK(ret_create2, "pthread_create2");

    // 捕获、阻塞 并清理资源
    int ret_join1 = pthread_join(tid1, NULL);
    THREAD_ERROR_CHECK(ret_join1, "pthread_join");
    int ret_join2 = pthread_join(tid2, NULL);
    THREAD_ERROR_CHECK(ret_join2, "pthread_join");

    // 销毁锁和条件变量
    pthread_mutex_destroy(&lock);
    pthread_cond_destroy(&cond);
 
    return 0;
}


